home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Risc World 3
/
Risc World 3.iso
/
SOFTWARE
/
ISSUE6
/
PD
/
PDF
/
GuiLib
/
GuiFlex
/
h
/
flex_c
next >
Wrap
Text File
|
2003-02-14
|
4KB
|
124 lines
//--------------------------------------------------------------------------
//
// Copyright (c) 2002, Colin Granville
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
// conditions are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials
// provided with the distribution.
//
// * The name Colin Granville may not be used to endorse or promote
// products derived from this software without specific prior
// written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
// OF THE POSSIBILITY OF SUCH DAMAGE.
//
//--------------------------------------------------------------------------
#ifndef GUILIB_FLEX_C_H
#define GUILIB_FLEX_C_H
#include <string.h>
#include "GuiFlexGlobal.h"
//
// basic flex buffer - other flex buffers implimented in terms of this
//
class FlexChar
{
public:
FlexChar(int size=0);
~FlexChar();
char* const & anchor() {return fanchor.data;}
const char* const & anchor() const {return (const char* const &)fanchor.data;}
void clear();
const char &at(int pos) const {return fanchor.data[pos];}
char &at(int pos) {return fanchor.data[pos];}
const char &operator[](int pos) const {return fanchor.data[pos];}
char &operator[](int pos) {return fanchor.data[pos];}
int extend(int size) {return gflex()->extend(fanchor,size);}
int resize(int size) {return extend(size);}
int extend(int at,int by) {return gflex()->midExtend(fanchor,at,by);}
void move(int to, int from,int n) {memmove(&at(to),&at(from),n);}
int size() const {return gflex()->size(fanchor);}
private:
GuiFlexAnchor fanchor;
FlexChar(const FlexChar&); // copying not allowed - declared but not defined
void operator=(FlexChar&); // copying not allowed - declared but not defined
};
class FlexCharBuf
{
public:
FlexCharBuf (int log2_block_siz=8);
char* const & anchor() {return fc.anchor();}
virtual ~FlexCharBuf();
const char &at(int pos) const {return fc.at(pos);}
char &at(int pos) {return fc.at(pos);}
const char &operator[](int pos) const {return at(pos);}
char &operator[](int pos) {return at(pos);}
int size() const {return _size;}
int capacity() const {return fc.size();}
void clear();
void move(int to, int from,int n) {fc.move(to,from,n);}
int extend(int size);
int resize(int size);
int extend(int pos,int by);
int append(char c);
int insert(int pos,char c);
private:
FlexChar fc;
int log2_block_size;
int _size;
int round(int size) {return ((size>>log2_block_size)+1)<<log2_block_size;}
};
inline int FlexCharBuf::extend(int size)
{
return (size<=capacity() || fc.extend(round(size)))? _size=size,1:0;
}
inline int FlexCharBuf::resize(int size)
{
return extend(size);
}
inline int FlexCharBuf::append(char c)
{
return (extend(size()+1))?at(size()-1)=c,1:0;
}
inline int FlexCharBuf::insert(int pos,char c)
{
return (extend(pos,1))?at(pos)=c,1:0;
}
#endif